package com.dzsw.config;

import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class HttpConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
    }

    /**
     * 指定负载均衡策略
     *
     * Ribbon自带负载均衡策略：
     * 1. RoundRibbonRule：轮询。人人有份，一个个来！
     * 2. RandomRule：随机。拼人品了！
     * 3. AvailabilityFilteringRule：先过滤掉由于多次访问故障而处于断路器跳闸状态的服务，以及并发连接数超过阈值的服务，剩下的服务，使用轮询策略。
     * 4. WeightedResponseTimeRule：根据平均响应时间计算所有服务的权重，响应越快的服务权重越高，越容易被选中。一开始启动时，统计信息不足的情况下，使用轮询。
     * 5. RetryRule：先轮询，如果获取失败则在指定时间内重试，重新轮询可用的服务。
     * 6. BestAvailableRule：先过滤掉由于多次访问故障而处于断路器跳闸状态的服务，然后选择一个并发量最小的服务。
     * 7. ZoneAvoidanceRule：复合判断 server 所在区域的性能和 server 的可用性选择服务器
     *
     * @return IRule
     */
//    @Bean
    public IRule myRule() {
        // 指定重试策略：随机策略
        return new BestAvailableRule();
    }
}
